/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import javax.swing.JOptionPane;
import view.ProcessadoresViewFrame;

/**
 *
 * @author
 * Abraão de Santana
 * Jorge Thiago
 * Leandro C. Arantes
 */
public class Processador {

    private Memoria memoria = null;
    private boolean executando = false;
    private int time = 0;
    private int executionStartTime = -1;
    private Processo processoAtivo;
    private int number;

    //MODIFICAR O FRAME. Colocar a nova interface
    private ProcessadoresViewFrame frame;

    public Processador(Memoria memoria, ProcessadoresViewFrame frame, int number) {
        this.frame = frame;
        this.memoria = memoria;
        this.number = number;
    }

    public Memoria getMemoria() {
        return memoria;
    }

    public void setMemoria(Memoria memoria) {
        this.memoria = memoria;
    }

    public boolean isExecutando() {
        return executando;
    }

    public void setExecutando(boolean executando) {
        this.executando = executando;
    }

    public void increaseTime()
    {
        time++;

        if ( executando && processoAtivo != null )
        {
            int timeExecuting = time - executionStartTime;
            if ( processoAtivo.getTempoDoProcessamento() == timeExecuting )
            {
                processoAtivo.setEstado(Processo.TERMINADO);
                memoria.removerProcesso( processoAtivo );
                control.SistemaOperacional.freeResources( processoAtivo );
                setExecutando(false);
                frame.setActiveProcessName(number, "---");
            }
        }
    }

    public Processo getProcessoAtivo() {
        return processoAtivo;
    }

    public void setProcessoAtivo(Processo processoAtivo) {
        this.processoAtivo = processoAtivo;
        this.executionStartTime = this.time + 1;
        setExecutando(true);
        processoAtivo.setEstado(Processo.EXECUTANDO);
        frame.setActiveProcessName(number, String.valueOf(processoAtivo.getId())); //Trocar o método!        
    }

    public void paraProcessoAtual()
    {
        int executedTime = time - executionStartTime;
        processoAtivo.setTempoDoProcessador(processoAtivo.getTempoDoProcessamento() - executedTime);
        executando = false;
        JOptionPane.showMessageDialog(null, "O processo " + processoAtivo.getId() + " foi interrompido");
        processoAtivo.setEstado(Processo.PRONTO);
        frame.setActiveProcessName(number, "---"); //Trocar o método! 
    }

}
